package top.jfunc.json.impl;

import top.jfunc.common.utils.Map2Bean;
import top.jfunc.json.Json;
import top.jfunc.json.JsonArray;
import top.jfunc.json.JsonException;
import top.jfunc.json.JsonObject;
import top.jfunc.json.impl.parse.JSONParser;
import top.jfunc.json.utils.JsonUtil;

import java.util.List;
import java.util.Map;

/**
 * @author xiongshiyan
 * 代表一个 JSONObject
 */
public class JSONObject extends BaseMapJSONObject{
    public JSONObject(Map<String, Object> map) {
        super(map);
    }

    public JSONObject() {
    }

    /**
     * 返回形如{"apple":"red","lemon":"yellow"}的字符串
     */
    @Override
    public String toString() {
        ///
        /*sb.append("{");
        Set<Map.Entry<String, Object>> set = super.map.entrySet();
        for (Map.Entry<String, Object> entry : set) {
            Object value = entry.getValue();
            if (value == null) {
                continue;// 对于null值，不进行处理，页面上的js取不到值时也是null
            }
            sb.append("\"").append(entry.getKey()).append("\":");
            JsonUtil.appendValue(sb, value , true);
            sb.append(",");
        }
        int len = sb.length();
        if (len > 1) {
            sb.delete(len - 1, len);
        }
        sb.append("}");*/

        return JsonUtil.mapToStr(this.map);
    }


	@Override
	protected String map2Str(Map<String, Object> map) {
        return new JSONObject(map).toString();
    }

	@Override
	public JsonObject getJsonObject(String key) {
		assertKey(key);
		//这里不能使用getJSONObject，因为每一种Json实现不一样，给出的JsonObject类型是不一致的。
		//这里就是各种JsonObject不能混用的原因
		Object temp = this.map.get(key);
		Object t = checkNullValue(key, temp);

		if(t instanceof Map){
			return new top.jfunc.json.impl.JSONObject((Map<String, Object>) t);
		}

		return (JsonObject) t;
	}

	@Override
	public JsonArray getJsonArray(String key) {
		assertKey(key);
		//这里不能使用getJSONObject，因为每一种Json实现不一样，给出的JsonObject类型是不一致的。
		//这里就是各种JsonObject不能混用的原因
		Object temp = this.map.get(key);
		Object t = checkNullValue(key, temp);

		if(t instanceof List){
			return new JSONArray((List<Object>)t);
		}
		return (JsonArray) t;
	}


    @Override
    public JsonObject parse(String jsonString) {
        Map<String, Object> map = str2Map(jsonString);
        return new JSONObject(map);
    }

    @Override
    protected Map<String, Object> str2Map(String jsonString) {
        JSONParser jsonParser = new JSONParser();
        Json jsonObject = jsonParser.fromJSON(jsonString);
        return (Map<String, Object>)jsonObject.unwrap();
    }

	@Override
	public <T> String serialize(T javaBean, boolean nullHold, String... ignoreFields) {
        Map<String, Object> map = JsonUtil.bean2Map(javaBean , nullHold , ignoreFields);
        return new JSONObject(map).toString();
    }

	@Override
	public <T> T deserialize(String jsonString, Class<T> clazz) {
        Map<String, Object> map = str2Map(jsonString);
        return Map2Bean.convert(map, clazz);
    }


    @Override
    public Json toJson(Object o) {
        if(o instanceof List){
            return new JSONArray((List<Object>) o);
        }
        if(o instanceof Map){
            return new JSONObject((Map<String, Object>) o);
        }
        try {
            return (Json) o;
        } catch (Exception e) {
            throw new JsonException("不能将非Json的对象转换为Json");
        }
    }
}